package com.zpf.service.impl;

import com.zpf.dao.CartDao;
import com.zpf.dao.GoodsDao;
import com.zpf.dao.impl.CartDaoImpl;
import com.zpf.dao.impl.GoodsDaoImpl;
import com.zpf.pojo.Cart;
import com.zpf.pojo.Goods;
import com.zpf.service.CartService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CartServiceImpl implements CartService {
    CartDao cartDao = new CartDaoImpl();
    GoodsDao goodsDao = new GoodsDaoImpl();
    @Override
    public boolean createCart(Integer uid, Integer pid) {
        //根据用户id和商品id ，到数据库中查询是否有该数据
        Cart cart = cartDao.findCartByUidAndPid(uid, pid);
        //根据商品id查询
        Goods goods = goodsDao.findGoodsById(pid);
        if (cart != null) {
            //2.判断，如果能查询到，进行购买数量的添加
            cart.setNum(cart.getNum()+1);
            //将商品对象放入购物车中
            cart.setGoods(goods);
            //从新计算总价钱
            cart.setMoney(cart.getNum()*goods.getPrice());

            //调用dao，将最新的购物车数据更新到表中
            cartDao.updateCart(cart);
        }else {
            //3.如果查不到这个购物项的数据，那么作为新的添加到数据库中
            //因为cart购物车为null，所有需要创建购物车对象
            cart = new Cart();
            //用户id，商品id，数量，价钱
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(1);
            //将商品对象放入购物车中
            cart.setGoods(goods);
            cart.setMoney(cart.getNum()*goods.getPrice());
            cartDao.insertCart(cart);
        }
            return false;
    }

    @Override
    public List<Cart> findCartListByUid(Integer uid) {
        //根据用户id，查询购物项集合
        List<Cart> cartList = cartDao.findCartListByUid(uid);
        //查询所有商品数据
        List<Goods> goodsList = goodsDao.findGoodsAll();

//        时间空间复杂度
//        简单了解：（时间与空间相违背）
//        时间：程序执行的快门可以用时间表示，执行的时间越少，说明执行效率越高，代码越有优秀
//        空间：程序存储需要占用磁盘或者内存空间，当然是占用的越少越好
//        List的时间复杂度S = 0(n)
//        Map 的时间复杂度S = 0(1)

        //优化，代码执行效率,笛卡尔积，遍历次数 = carList集合中的个数+goodsList集合中的个数
        //1.将数据量多的集合，放入Map中
        Map<String,Goods> goodsMap = new HashMap<String, Goods>();
        //2.遍历另一个集合，在遍历过程中，直接从Map中get数据
        if (goodsList != null) {
            for (Goods goods : goodsList) {
                //以商品id作为key，以商品对象作为value
                goodsMap.put(String.valueOf(goods.getId()),goods);
            }
        }
        if (cartList != null) {
            for (Cart cart : cartList) {
                Goods goods = goodsMap.get(String.valueOf(cart.getPid()));
                if (goods != null) {
                    //如果商品对象不为空，放入购物车对象中
                    cart.setGoods(goods);
                }
            }
        }

        return cartList;
    }

    @Override
    public void updateCart(Integer cid, Integer num) {
       Cart cart = cartDao.findById(cid);
       Goods goods = goodsDao.findGoodsById(cart.getPid());

       //从新计算总价
        cart.setNum(num);
        cart.setGoods(goods);
        cart.setMoney(goods.getPrice() * num);
        //算完更新
        cartDao.updateCart(cart);
    }

    @Override
    public void deleteById(Integer id) {
        cartDao.deleteById(id);
    }
}
